100 :
110 CLEAR: REMark ThORgame_bas
120 REMark Press '0' or ESCape to quit
130 REMark '3' is hard, to '9' is easy
140 REMark press < or > to protect viking
150 REMark but you have 2x9 lives..
160 REMark 2x9 bonus lives possible !
170 :
180 kt=0: REMark kt=1 counts recursion
190 bp=0: REMark let bp=1 for thunder !
200 :
210  WINDOW 512,256,0,0: SCALE 100,0,0
220  x0=60: x1=100: y1=13
230  RANDOMISE DATE: sky: FILL 0: matrix
240  REPeat game: main
250 :
260 DEFine PROCedure sky
270  PAPER 1
280 END DEFine
290 :
300 DEFine PROCedure difficulty
310 LOCal i$,d: REPeat d
320  CLS: AT 1,1: STRIP 0: INK 7
330  PRINT'Hit (0) 3 6 9 ?':i$=INKEY$(-1)
340  IF i$ INSTR '0369': ps=i$: EXIT d
350  END REPeat d: IF NOT ps: STOP
360 END DEFine
370 :
380 DEFine PROCedure main
390  LOCal ps,try,loop,zx,v,wait,ct,st
400  difficulty: lf0=1: lf1=1: try=18
410  loop=0: REPeat loop
420   CLS: sky: st=0: loop=loop+1
430   OVER 0: viking: inks: prt
440   zx=RND(60 TO 140)
450   ct=0: v=STROKE(zx,100)
460   :
470   x1=RND(30 TO 130): REMark head1
480   x0=RND(30 TO 130): REMark head0
490   IF try<2: x1=zx: x0=zx
500   IF x0 AND x1: IF x0>=x1: xn=x1: x1=x0+2: x0=xn
510   FOR wait=1 TO 80: PAUSE 1
520  END REPeat loop
530 END DEFine
540 :
550 DEFine FuNction STROKE(x,y)
560 LOCal j,rx,x2,y2,ox,oy,xx,yy,p
570 xx=x: yy=y: st=st+1: p=ps
580 IF (loop MOD 10)=0 THEN
590   IF bp: BEEP 12345,6
600   IF try>10: try=18: ELSE try=9*lf0+9*lf1
610 END IF
620 IF kt:  AT#0, 3,1: PRINT#0!! st!!
630 FOR j=1 TO RND(5 TO 8)
640   PAUSE p: LINE x,y: rx=RND(-20 TO 20)
650   x2=x+rx+1: y2=y-RND(1 TO 9)
660 IF keys: RETurn 0
670   IF x2<10 OR x2>150 OR y2<2: RETurn 0
680   LINE TO x2,y2: x=x2: y=y2
690   ct=ct+1: IF ct>30: RETurn 1
700   ox=0: oy=0: REMark IF keys: RETurn 0
710   : REMark recursion...
720   IF rx>0: ox=x2: oy=y2: IF STROKE(ox,oy): RETurn 1: ELSE ik=ik+1: INK ik
730   IF bp: BEEP 12345,RND(150 TO 255)
740 END FOR j
750 RETurn 0: END DEFine
760 :
770 DEFine PROCedure inks
780  ik=30: INK ik
790 END DEFine
800 :
810 DEFine PROCedure shield(ns)
820 LOCal s: INK 5,4,3
830  IF lf0=1: IF ns=0: OVER -1: CIRCLE x0,y1,12
840  IF lf1=1: IF ns=1: OVER -1: CIRCLE x1,y1,12
850  IF lf0=1 AND lf1=1: IF ns=2: OVER -1: CIRCLE x1,y1,12: CIRCLE x0,y1,12
860 :
870  FOR s=1 TO 25: PAUSE 1
880  IF lf0=1: IF ns=0: CIRCLE x0,y1,12: try=try-1
890  IF lf1=1: IF ns=1: CIRCLE x1,y1,12: try=try-1
900  IF lf0=1 AND lf1=1: IF ns=2: CIRCLE x0,y1,12: CIRCLE x1,y1,12: try=try-2
910  OVER 0: IF try<1: blank
920 prt: END DEFine
930 :
940 DEFine FuNction keys
950  LOCal key: key=KEYROW(1)
960  IF key=8 : STOP: REMark ESCape
970  IF key=2 : shield 0: RETurn 1: REMark left
980  IF key=16: shield 1: RETurn 1: REMark right
990  IF key=18: shield 2: RETurn 1: REMark both
1000  hit_test: RETurn 0
1010 END DEFine
1020 :
1030 DEFine PROCedure hit_test
1040   IF x2>(x0-5) AND x2<(x0+5) THEN
1050   IF y2>(y1-5) AND y2<(y1+5) THEN
1060    IF bp: BEEP 32765,55
1070   IF lf0=1: IF key<>2: lf0=0: zap 0
1080   END IF : END IF
1090 :
1100   IF x2>(x1-5) AND x2<(x1+5) THEN
1110   IF y2>(y1-5) AND y2<(y1+5) THEN
1120    IF bp: BEEP 32765,55
1130    IF lf1=1: IF key<>16: lf1=0:zap 1
1140   END IF : END IF
1150   IF lf0=0 AND lf1=0: try=0: blank
1160 END DEFine
1170 :
1180 DEFine PROCedure zap(zp)
1190 LOCal k: FILL 1
1200  FOR k=1 TO 12
1210   IF k>7: INK 2,2,3: ELSE INK 2,k,3
1220   IF zp=0: CIRCLE x0,y1,k: PAUSE 9
1230   IF zp=1: CIRCLE x1,y1,k: PAUSE 9
1240  END FOR k: FILL 0: try=try-1
1250  IF lf0=0 AND lf1=0: try=0: blank
1260 END DEFine
1270 :
1280 DEFine PROCedure blank
1290  LOCal t: PAPER 0: CLS: prt
1300  FOR t=1 TO 50: PAUSE 6
1310  sky: main
1320 END DEFine
1330 :
1340 DEFine PROCedure prt
1350  AT 24,35: OVER 0: INK 7: PAPER 0
1360  PRINT 'lives'!try!!!
1370  AT 24,45: PRINT 'score'!loop!!!
1380  sky: INK ik
1390 END DEFine
1400 :
1410 DEFine PROCedure viking
1420  LOCal m
1430  FOR m=1 TO 30
1440   m1=Mx(m,1)+RND(2)-RND(2)
1450   m2=Mx(m,2)+RND(2)-RND(2)
1460   m3=Mx(m,3): REMark clouds
1470   m4=Mx(m,4): INK 7,6,m4
1480   FILL 1: CIRCLE m1,m2,m3: FILL 0
1490  END FOR m: INK 6: REMark clouds
1500   IF lf0=1: head 0
1510   IF lf1=1: head 1
1520  INK 4,6,RND(3): FILL 1
1530  LINE 0,0 TO 512,0 TO 512,10 TO 0,10
1540  LINE TO  0,0: FILL 0: PAUSE 99
1550 END DEFine
1560 :
1570 DEFine PROCedure matrix
1580 REMark clouds :
1590  DIM Mx(35,4)
1600  FOR m=1 TO 30
1610   Mx(m,1)=RND(256)
1620   Mx(m,2)=RND(73 TO 96)
1630   Mx(m,3)=RND(5)+5
1640   Mx(m,4)=RND(3)
1650  END FOR m
1660 END DEFine
1670 :
1680 DEFine PROCedure head(hd)
1690 LOCal xh
1700 IF hd=0: xh=x0: ELSE xh=x1
1710  FOR m=PI TO PI*1.2 STEP PI/9
1720   ARC xh-4,y1+8 TO xh+4,y1+8,m
1730  END FOR m: REMark horns
1740  INK 2,7,3: FILL 1: CIRCLE xh,y1,5
1750  FILL 0: INK 1: CIRCLE xh-2, y1+2,.5
1760  CIRCLE xh+2, y1+2,.5: INK 0
1770   POINT xh-1,y1, xh+1,y1
1780  LINE  xh-1,y1-2 TO xh+1,y1-2: INK 6
1790   FILL 1: ELLIPSE xh,y1+4,3,.4,PI/2
1800 FILL 0
1810 END DEFine
1820 ::
